/**
 * 项目名称: springcloudtest
 * 类名称: UserService.java
 * 包名称: com.zw.trans.tx
 * <p>
 * 修改履历:
 * 日期       2019-11-11
 * 修正者     Thomas
 * 主要内容   初版做成
 * <p>
 * Copyright (c) 2016-2019
 */
package com.zw.trans.tx;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * @Author Thomas 2019-11-11 15:45
 * The world of programs is a wonderful world
 */
@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private StudentService studentService;

    /**
     * 事务处理
     * 默认 + Propagation.NOT_SUPPORTED
     */
    @Transactional
    public void insert() {
        userDao.insert();
        System.out.println("客户插入");
        studentService.insert();
    }

    /**
     * 支持当前事务，如果当前没有事务，就以非事务方式执行
     * SUPPORTS + 默认
     */
    @Transactional(propagation = Propagation.SUPPORTS)
    public void insert1() {
        userDao.insert();
        System.out.println("客户插入");
        try {
            studentService.insert1();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 使用当前的事务，如果当前没有事务，就抛出异常。,如果有就加入
     * MANDATORY + 默认
     */
    @Transactional()
    public void insert2() {
        userDao.insert();
        System.out.println("客户插入");
        try {
            studentService.insert2();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 新建事务，如果当前存在事务，把当前事务挂起,
     * 相当于创建了一个新的事务，两个事务
     * 默认+REQUIRES_NEW
     */
    @Transactional()
    public void insert3() {
        userDao.insert();
        System.out.println("客户插入");
//        throw new RuntimeException();
        try {
            studentService.insert3();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     *
     */
    @Transactional()
    public void insert4() {
        userDao.insert();
        System.out.println("客户插入");
//        throw new RuntimeException();
        try {
            studentService.insert4();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     *
     */
    @Transactional()
    public void insert5() {
        userDao.insert();
        System.out.println("客户插入");
//        throw new RuntimeException();
//        try {
            studentService.insert5();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }

    }

    /**
     * never
     */
    @Transactional()
    public void insert6() {
        userDao.insert();
        System.out.println("客户插入");
//        throw new RuntimeException();
//        try {
        studentService.insert6();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }

    }

    /**
     * nested
     */
//    @Transactional()
    public void insert7() {
        userDao.insert();
        System.out.println("客户插入");
//        throw new RuntimeException();
//        try {
        studentService.insert7();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }

    }
}
